package com.gitee.feizns.quickstart.dict;

import com.gitee.feizns.quickstart.jackson.Val;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * dict 存储管理器
 * @author feizns
 * @since 2024/12/8
 */
public interface DictDepositor<T extends Entry> {

    /**
     * 重新加载（从原数据源加载）
     * @return {@link DictDepositor }<{@link T }>
     */
    DictDepositor<T> reload();

    /**
     * 将整个字典作为Json值其格式如下：
     * <pre>{@code
     *  {
     *      'key': value
     *  }
     * }</pre>
     * @return {@link Val}
     */
    default Val value() {
        return Val.of(entries());
    }

    /**
     * 将整个字典作为Json值其格式如下：
     * <pre>{@code
     *  {
     *      'key': value
     *  }
     * }</pre>
     * @return {@link Val}
     */
    default Val value(String key) {
        T entry = get(key);
        return Val.of(entry != null ? entry.getValue() : null);
    }

    /**
     * Key:Value Map
     * <pre>{@code
     *  {
     *      'key': value
     *  }
     * }</pre>
     * @return {@link Map}<{@link String}, {@link Object}>
     */
    default Map<String, Object> entries() {
        return list().stream().collect(Collectors.toMap(Entry::getKey, Entry::getValue, (o, n) -> n, LinkedHashMap::new));
    }

    /**
     * 所有字典
     * @return {@link List}<{@link Entry}>
     */
    List<T> list();

    /**
     * 获取字典
     * @param key 键
     * @return {@link Dict}
     */
    T get(String key);

    /**
     * 放置字典条目
     * @param entry 值
     */
    void put(T entry);

    /**
     * 放置字典条目
     * @param entries 条目列表
     */
    default <C extends Collection<T>> void putAll(C entries) {
        entries.forEach(this::put);
    }

    /**
     * 包含字典
     * @param key 字典键
     * @return 是否存在
     */
    boolean exists(String key);

    /**
     * 删除
     * @return {@link Entry }
     */
    T delete(String key);

}
